package run.theo.mallcommons.util;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * mybatis-plus代码生成器
 *
 * @author theo
 * @date 2022/10/16 16:45
 * @since 1.0
 */
public class MyBatisPlusGenerator {

    //修改为你自己的数据库地址
    private static final String datasourceUrl = "jdbc:mysql://localhost:3306/boottest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
    //修改为你自己的数据库账号
    private static final String datasourceUsername = "root";
    //修改为你自己的数据库密码
    private static final String datasourcePassword = "root";

    public static void main(String[] args) {
        // 项目路径
        String projectPath = System.getProperty("user.dir");

        // 代码生成器
        FastAutoGenerator.create(datasourceUrl, datasourceUsername, datasourcePassword)
                // 全局配置
                .globalConfig(initGlobalConfig(projectPath))
                .packageConfig(initPackageConfig(projectPath))
                .strategyConfig(initStrategyConfig())
                // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }
    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

    /**
     * 初始化全局配置
     */
    private static Consumer<GlobalConfig.Builder> initGlobalConfig(String projectPath) {
        System.out.println(projectPath);
        return builder -> {
            // 作者
            builder.author("theo")
                    // 输出路径
                    .outputDir(projectPath + "/mall-order/src/main/java")
                    // 禁止打开输出目录
                    .disableOpenDir()
                    // 开启swagger
                    .enableSwagger()
                    // 注释日期
                    .commentDate("yyyy/MM/dd HH:mm")
                    // 开启覆盖之前生成的文件
                    .fileOverride();
        };
    }

    /**
     * 初始化包配置
     */
    private static Consumer<PackageConfig.Builder> initPackageConfig(String projectPath) {
        return builder -> {
            builder.parent("run.theo.mallorder") //生成文件的父包
                    .entity("entity")
                    .service("service")
                    .serviceImpl("service.impl")
                    .controller("controller")
                    .mapper("mapper")
                    .xml("mapper")
                    .pathInfo(Collections.singletonMap(OutputFile.mapperXml, projectPath + "/src/main/resources/mapper/"));
        };
    }

    /**
     * 初始化策略配置
     */
    private static BiConsumer<Function<String, String>, StrategyConfig.Builder> initStrategyConfig() {
        return (scanner, builder) -> {
            builder.addInclude(getTables(scanner.apply("请输入表名，多个英文逗号分隔？所有输入 all")))
                    // 增加过滤表前缀
                    //.addTablePrefix("t_")
                    // service策略配置
                    .serviceBuilder()
                    .formatServiceFileName("%sService")
                    .formatServiceImplFileName("%sServiceImpl")
                    // entity策略配置
                    .entityBuilder()
                    // 数据库表映射到实体的命名策略
                    .naming(NamingStrategy.underline_to_camel)
                    // 数据库表字段映射到实体的命名策略
                    .columnNaming(NamingStrategy.no_change)
                    // 开启lombok模型
                    .enableLombok()
                    // controller策略设置
                    .controllerBuilder()
                    .formatFileName("%sController")
                    .enableRestStyle()
                    .enableHyphenStyle()
                    // mapper策略设置
                    .mapperBuilder()
                    // 生成通用的resultMap
                    .enableBaseResultMap()
                    .enableBaseColumnList()
                    .superClass(BaseMapper.class)
                    .formatMapperFileName("%sMapper")
                    .enableMapperAnnotation()
                    .formatXmlFileName("%sMapper");
        };
    }


}
